#include<iostream>
#include<signal.h>
#include<unistd.h>

using namespace std;
void show_pending(const sigset_t &pending)
{
  for(int i=31;i>0;i--)
  {  if(sigismember(&pending,i)) //
    { 
cout<<"1";
    }
    else{
        cout<<"0";
    }
  }
  cout<<"\n";

}
static void handler(int signo)
{
    cout<<signo<<" 号信号递达"<<endl;
}


int main()
{  
  
  signal(2,handler);
    sigset_t set,oset,pending;
   sigemptyset(&set);//默认所有信号都不被阻塞
   sigemptyset(&oset);
   sigaddset(&set,2);//阻塞2号信号
   sigprocmask(SIG_SETMASK,&set,&oset);//读取或更改进程的信号屏蔽字（阻塞信号屏蔽集）
   int cnt=10;
   int n=0;
   while(true)
{    
   //打印pending信号集
    sigemptyset(&pending);
    sigpending(&pending);//返回被阻塞而被调用的信号
    show_pending(pending);
    sleep(1);
    if(cnt--==0)
    {
        sigprocmask(SIG_SETMASK,&oset,&set);
        cout<<"恢复对信号的屏蔽，不屏蔽任何信号"<<endl;
        n=10;
    }
   if(n--==1)
   {
    sigprocmask(SIG_SETMASK,&set,&oset);
        cout<<"重新屏蔽"<<endl;
        cnt=10;
        n=0;
   }
    }

  




}